<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //Promise的出现就是为了解决回调地狱的问题


        //回调地狱：指的就是回调函数中又嵌套多层回调函数的效果


        //Promise只是将回调地狱的写法换了一种表现形式，让代码看起来更清晰而已



        //1. 只需要知道回调函数是通过.then方法传递的即可

        //一个插件告诉你，当前插件支持Promise，就意味着，这个插件中的所有的回调函数，我都可以使用.then

        // axios({
        //     url: ""
        // }).then(function(){

        // }).then(function(){

        // })


        //2. 如果要自己写框架或者类库之类的内容，我们需要学会如何自己封装一个Promise对象


        // setTimeout(function(){

        // }, 1000)




        // Promise是一个构造函数，这个构造函数可以用来创建一个管理异步任务的对象
        // 这个对象会有三种状态：
        // 1. pending: 正在进行
        // 2. fulfilled: 已完成
        // 3. rejected: 已失败


        // var isSuccess = Boolean(Math.round(Math.random()))

        // var pro = new Promise(function (resolve, reject) {
        //     //在promise对象中，我们进行异步任务的操作
        //     setTimeout(function () {
        //         //一般的异步操作，都只会有两种结果
        //         //1. 成功  2. 失败
        //         // 如果成功了 我们需要将当前Promise对象标记为fulfilled
        //         // 通过调用resolve函数就可以实现

        //         // 如果失败了 我们需要将当前Promise对象标记为rejected
        //         // 通过调用reject函数就可以实现

        //         if(isSuccess){
        //             resolve();
        //         }else{
        //             reject();
        //         }

        //     }, 1000)
        // })


        // pro.then(function(){
        //     //成功之后的回调
        //     console.log("ok")
        // }, function(){
        //     //失败之后的回调
        //     console.log("no ok")
        // })



        // 一般是框架或者插件的内部代码
        function timeout(time) {
            //这个函数需要返回一个Promise对象

            return new Promise(function(a, b){
                setTimeout(function(){
                    //我们可以给resolve传递参数
                    //成功的回调会自动接收到这个参数
                    a("is ok");
                }, time)
            })
        }


        //这个是使用的代码
        timeout(1000)
        .then(function (num) {
            console.log("1s后了", num)
        })
		
		
		
var p1 = new Promise(function (s, reject) {
  reject('timeout in ' + 2+ ' seconds.');
  s('200 OK');
})

var p2 = p1.then(function (r) {
    console.log('Done: ' + r);
},function (r) {
    console.log('Done: ' + r);
});


        //1. Promise对象究竟是个什么东西？
        //  Promise对象包含一个异步操作，他会自动进行这个异步操作，但是在异步操作完成之后，Promise只会负责将当前Promise的状态进行改变

        //2. Promise对象包含的这个异步操作的成功的回调函数（.then传递的函数）什么时候执行？
        //  当Promise中的异步操作完成之后，Promise中必然会调用resolve或者reject改变这个Promise的状态，只要状态一改变。then中的函数就会自动被调用， 如果是通过resolve函数标记为成功，那就调用then中第一个函数 如果是通过reject函数标记为失败了 那就调用then中的第二个函数


        //我们可以将Promise看做是一个异步任务的管理者

        //他会自己负责执行异步操作，我们只需要将异步操作之后要做的事情告诉他，他在异步操作完成之后，会自己标记状态，自动执行回调函数的。

    </script>
</body>

</html>